package middleware

import (
	"blog_go/models/ctype"
	"blog_go/utils"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
)

// 验证登录信息的token
func JwtAuthHandle() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Request.Header.Get(utils.Token)
		logoutCheck(token)
		if token == "" {
			panic("未携带token")
		}
		parseToken, err := utils.ParseToken(token)
		if err != nil {
			logrus.Error(err)
			panic(err)
		}
		c.Set(utils.Claims, parseToken)
		c.Next()
	}
}

func JwtAuthAdmin() gin.HandlerFunc {
	return func(c *gin.Context) {
		url := c.Request.URL
		// 登录接口不需要权限
		if url.Path != "/api/admin/user/email_login" {
			token := c.Request.Header.Get(utils.Token)
			logoutCheck(token)
			if token == "" {
				panic("未携带token")
			}
			parseToken, err := utils.ParseToken(token)
			if err != nil {
				logrus.Error(err)
				panic(err)
			}
			if parseToken.Role != int(ctype.PermissionAdmin) {
				panic("不是admin用户")
			}
			c.Set(utils.Claims, parseToken)
		}
		c.Next()
	}
}

func JwtAuthAdminWebSocket(c *gin.Context) {
	token := c.Request.Header.Get(utils.Token)
	if token != "" {
		// 这里是不需要关注错误的 出现错误当做游客处理
		parseToken, err := utils.ParseToken(token)
		if err != nil {
			logrus.Error(err)
		} else {
			c.Set(utils.Claims, parseToken)
		}
	}
	c.Next()
}

func logoutCheck(token string) {
	if utils.LogoutTokenExists(token) {
		panic("token已经注销")
	}
}
